package com.itany.ums.service.impl;

import java.util.List;

import com.itany.ums.constant.RoleEnum;
import com.itany.ums.constant.StateEnum;
import com.itany.ums.dao.UserDao;
import com.itany.ums.dao.impl.UserDaoImplForMap;
import com.itany.ums.entity.User;
import com.itany.ums.exception.EmailEmptyException;
import com.itany.ums.exception.EmailExistsException;
import com.itany.ums.exception.EmailWrongException;
import com.itany.ums.exception.LoginnameEmptyException;
import com.itany.ums.exception.LoginnameOrPasswordWrongException;
import com.itany.ums.exception.PasswordEmptyException;
import com.itany.ums.exception.PasswordWrongException;
import com.itany.ums.exception.PhoneEmptyException;
import com.itany.ums.exception.PhoneExistsException;
import com.itany.ums.exception.PhoneNumWrongException;
import com.itany.ums.exception.UserLockedException;
import com.itany.ums.exception.UsernameEmptyException;
import com.itany.ums.exception.UsernameExistsException;
import com.itany.ums.service.UserService;
import com.itany.ums.vo.Result;
import com.itany.ums.vo.UserVo;

public class UserServiceImpl implements UserService {

	private UserDao userDao = new UserDaoImplForMap();

	// service只关心登录功能业务逻辑是怎样的
	@Override
	public User login(String loginname, String password) throws LoginnameEmptyException, PasswordEmptyException, LoginnameOrPasswordWrongException, UserLockedException {

		// 如果登录名为空, 则登录功能无法顺利进行
		if (loginname == null || "".equals(loginname)) {
			// return new Result(false, "登录名不可为空");
			throw new LoginnameEmptyException();
		}

		// 如果密码为空, 则登录功能无法顺利进行
		if (password == null || "".equals(password)) {
			// return new Result(false, "密码不可为空");
			throw new PasswordEmptyException();
		}

		// 以上两个判断通过, 说明登录名和密码都不为空
		// 将登录名和密码交给dao作为查询条件进行数据查询
		// 使用dao的功能
		User u = userDao.selectByLoginnameAndPassword(loginname, password);

		// 如果dao查询结果为null, 说明查询条件在数据库中不存在
		// 说明用户录入的登录名或密码不正确
		// 登录功能无法顺利完成
		if (u == null) {
			// return new Result(false, "登录名或密码错误");
			throw new LoginnameOrPasswordWrongException();
		}

		// 如果用户不为null, 验证用户的状态是否可以登录
		if (u.getState().equals(StateEnum.DISABLE.getStateCode())) {
			// return new Result(false, "用户已被锁定");
			throw new UserLockedException();
		}

		// 如果以上if都没满足, 说明用户录入的数据可用, 且与数据库中存储的信息匹配
		// 则登录操作成功

		// 以上过程中如果发生问题, 抛出异常
		// 没有发生问题, 则代码顺利执行到最后
		// 将数据返回
		// return new Result(true, "", u);
		return u;
	}

	// 验证手机号码是否已被使用
	// 验证逻辑: 以用户录入的手机号码为条件让dao做查询
	// 如果dao能查询到匹配的数据, 则说明手机号码在数据库中已存在
	// 如果dao的查询结果是null, 则说明手机号码在数据库不不存在

	// 处理注册的过程中, service需要让dao帮忙做三次查询操作
	// 分别以username, phone, email为条件进行数据查询
	// 根据dao的查询结果是否为null判断数据是否已被使用

	// 当所有数据都通过验证可用
	// 要将用户信息交给dao保存到数据库里
	@Override
	public void register(UserVo vo) throws UsernameEmptyException, PhoneNumWrongException, PasswordEmptyException, PasswordWrongException, PhoneEmptyException, EmailEmptyException, EmailWrongException, UsernameExistsException, PhoneExistsException, EmailExistsException {
		if (vo.getUsername() == null || "".equals(vo.getUsername())) {
			throw new UsernameEmptyException();
		}
		if (vo.getPassword() == null || "".equals(vo.getPassword())) {
			throw new PasswordEmptyException();
		}
		if (!vo.getPassword().equals(vo.getRePassword())) {
			throw new PasswordWrongException();
		}

		if (vo.getPhone() == null || "".equals(vo.getPhone())) {
			throw new PhoneEmptyException();
		}

		// 1开头, 第二位可以是35789, 共11位数字
		if (!vo.getPhone().matches("^[1][35789][\\d]{9}$")) {
			throw new PhoneNumWrongException();
		}

		if (vo.getEmail() == null || "".equals(vo.getEmail())) {
			throw new EmailEmptyException();
		}
		// 3到10字符(可以是字母数字下划线) + "@" + 3到5字符(可以是字母数字下划线) + ".com"或".cn"或".com.cn"
		if (!vo.getEmail().matches("[\\w]{3,10}[@][\\w]{3,5}((\\.com)|(\\.cn)|(\\.com\\.cn))")) {
			throw new EmailWrongException();
		}

		User check = userDao.selectByUsername(vo.getUsername());
		if (check != null) {
			throw new UsernameExistsException();
		}

		check = userDao.selectByPhone(vo.getPhone());
		if (check != null) {
			throw new PhoneExistsException();
		}

		check = userDao.selectByEmail(vo.getEmail());
		if (check != null) {
			throw new EmailExistsException();
		}

		User u = new User(vo.getUsername(), vo.getPassword(), vo.getPhone(), vo.getEmail());
		userDao.saveUser(u);
		// 以上过程中如果发生异常, 则抛出异常
		// 如果代码顺利执行到这, 则方法正常结束
	}

	@Override
	public Result modifyPwd(long id, String newPwd) {

		User u = userDao.selectById(id);
		if (u == null) {
			return new Result(false, "用户不存在");
		}

		userDao.updatePwd(id, newPwd);

		return new Result(true, "");
	}

	@Override
	public Result modifyUsername(long id, String username) {
		User u = userDao.selectById(id);
		if (u == null) {
			return new Result(false, "用户不存在");
		}

		if (username == null || username.isEmpty()) {
			return new Result(false, "新用户名不可为空");
		}

		// 1: alice, Alice
		User check = userDao.selectByUsername(username);
		if (check != null && !check.getId().equals(id)) {
			return new Result(false, "用户名已被使用");
		}

		userDao.updateUsername(id, username);

		return new Result(true, "");
	}

	@Override
	public User[] findAllNormal() {
		// 查询操作目标: 查询出所有普通用户
		// service层自带一个查询条件: 用户角色
		// 将该条件交给dao做查询
		List<User> users = userDao.selectByRole(RoleEnum.NORMAL.getRoleCode());
		User[] arr = new User[users.size()];
		users.toArray(arr);
		return arr;
	}

	@Override
	public Result modifyUserState(long id) {
		User u = userDao.selectById(id);
		if (u == null) {
			return new Result(false, "用户不存在");
		}

		if (u.getState().equals(StateEnum.ENABLE.getStateCode())) {
			userDao.updateStateById(id, StateEnum.DISABLE.getStateCode());
			return new Result(true, "修改成功");
		}

		if (u.getState().equals(StateEnum.DISABLE.getStateCode())) {
			userDao.updateStateById(id, StateEnum.ENABLE.getStateCode());
			return new Result(true, "修改成功");
		}

		return null;
	}

}
